热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

无监督学习|PCA主成分分析原理及Sklearn实现

文章目录1.降维2.PCA2.1最大化方差和最小化损失2.2坐标轴旋转3.PCA推导3.1PCA算法推导3.2维数选择4.Sklearn实现4.1主成分可视化5.在线可视化网站参考


文章目录

  • 1. 降维
  • 2. PCA
    • 2.1 最大化方差和最小化损失
    • 2.2 坐标轴旋转
  • 3. PCA 推导
    • 3.1 PCA 算法推导
    • 3.2 维数选择
  • 4. Sklearn 实现
    • 4.1 主成分可视化
  • 5. 在线可视化网站
  • 参考文献



相关文章:

机器学习 | 目录

无监督学习 | PCA 主成分分析之客户分类


1. 降维

假设你在使用一组数据来预测房价,你的数据包含以下特征:


  1. 房子面积

  2. 房间数量

  3. 附近学校排名

  4. 社区安全

但是可以看出,1、2 在于描述房子的大小,而 3、4 在描述周边环境。因此我们可以用两个新的特征来预测房价:1. 房子大小;2. 周边环境,我们称之为潜在变量。现在可能我们有很多可测量的特征,但或许只有少量的潜在特征,其中包含大部分的信息。

在本文中,我们主要讨论的是如何将维度降低,降低维度的方法有两种:1.特征选择,2. 特征提取

特征选择指的是从已有变量中选择较少的变量,如用“房子面积”来描述“房子大小”,用“社区安全”来描述“周边环境”,如逐步回归,在 Sklearn 中用 SelectKBest 选择K个最合适的特征,或用 SelectPercentile 选取前百分比的特征。

特征提取则是对同一类的变量进行融合,假设现在有很多特征可以使用,但只有一分布特征在驱动这个数据模式。因此我们希望找出一个组合特征(omposite feature,又称为主成分 principle component),从而将一大堆特征缩减至几个特征。如将“房子面积”和“房间数量”融合为“房子大小”,将“附近学校排名”和“社会安全”融合为“周边环境”,这就是降维,将维数从 4 降到了 2。

主成分分析(Principal Component Analysis, PCA)是最常用的一种降维方法,除此之外还有增量主成分分析(IPCA)、核主成分分析(KPCA)、局部线性嵌入(LLE)、多维缩放(SDA)、等度量映射(Isomap)、t-分布随机近邻嵌入(t-SNE)和线性判别(LDA)。[1]


2. PCA

假设下面是房子面积和房间数量的散点图,X 轴为房子面积,Y 轴为房间数量:



图1 房子面积与房间数量散点图

首先我们可以画出他们的主成分,如下所示:



图2 房子面积与房间数量的主成分

这看起来像个回归问题,但并不是这样的。在回归中,我们的目的是预测与输入值对应的输出值,在这里,我们并不是要预测任何值,而是算出数据的大致方向,使得我们的数据能够在尽量少地损失信息的同时映射在该方向上。

当我们找到了数据的主成分后,也就是向量的方向后,我们可以对数据进行一个映射,如下所示,我们的原始数据是二维的,但是,当我们把映射到主成分上之后,它就变成一维数据了。



图3 数据映射

下面,我将介绍如何确定主成分。


2.1 最大化方差和最小化损失

对于我们的数据,可以用一个椭圆,这个椭圆可以用两个参数来表示:短轴的距离和长轴的距离,可以看到,在长轴上,数据更加的分散,即方差更大。我们要做的就是找到方差最大的方向。



图4 方差最大化

为什么我们要找出具有最大方差的方向呢。换而言之,当我们在进行映射时,为什么要将所有数据点映射到方差最大的方向上呢?这是因为当我们沿着方差最大的方向进行映射时,它能够在最大程度上保留原有数据中所含信息。

当我们对数据进行映射时,就会造成信息损失,信息的损失量就等于某个特定的点与它在这条线上的新位置之间的距离



图5 信息损失

可以看到,对于图 5 的右图而言,此时数据在该方向上映射的方差最小,但信息损失也就最大。因此当我们将方差最大化的同时,实际上是将点与其在该线上的投影之间的距离最小化,即最小化信息损失。


2.2 坐标轴旋转

PCA 实际上是先对坐标轴进行旋转,通过计算数据映射在每个方向上的后的方差,选取前 K 个方差最大的特征。


3. PCA 推导


3.1 PCA 算法推导

假设输入样本为 Z={Z1,Z2,...,Zm}Z=\{Z_1,Z_2,...,Z_m\}Z={Z1,Z2,...,Zm},我们要通过 PCA 从 mmm 维降至 kkk 维,首先对样本进行中心化,即对每个属性减去其对应的均值:

X={Z1−Z1ˉ,Z2−Z2ˉ,...,Zm−Zmˉ}={X1,X2,...,Xm}(1)\begin{aligned} X & = \{Z_1-\bar{Z_1}, Z_2-\bar{Z_2}, ...,Z_m-\bar{Z_m} \} \\ & = \{X_1,X_2,...,X_m\}\\ \end{aligned}\tag{1} X={Z1Z1ˉ,Z2Z2ˉ,...,ZmZmˉ}={X1,X2,...,Xm}(1)

假设经过旋转后新的坐标为 XT⋅WX^T \cdot WXTW,其中 WWW 为单位正交基向量矩阵(WT⋅W=EW^T \cdot W =EWTW=E),因此要最大化投影间隔,即最大化其方差 WTXXTWW^T X X^T WWTXXTW(中心化后均值为 0):

max⁡W{WTXXTW}s.t.WTW=E(2)\begin{aligned} & \max \limits_{W} \{W^T X X^T W\} \\ & s.t. W^T W =E \\ \end{aligned}\tag{2} Wmax{WTXXTW}s.t.WTW=E(2)

由拉格朗日乘数法得:

WTXXTW+λ[E−WTW](3)W^T X X^T W + \lambda [E-W^T W] \tag{3}WTXXTW+λ[EWTW](3)

WWW 求导得:

∂∂W{WTXXTW+λ[E−WTW]}=2XXTW−2λEW=0(4)\frac{\partial}{\partial W}\bigg\{W^T X X^T W + \lambda [E-W^T W]\bigg\} = 2X X^T W - 2\lambda E W =0 \tag{4}W{WTXXTW+λ[EWTW]}=2XXTW2λEW=0(4)

因此有:

XXTw=λW(5)XX^Tw=\lambda W \tag{5}XXTw=λW(5)

(λE−XXT)W=0(6)(\lambda E - XX^T)W=0 \tag{6}(λEXXT)W=0(6)

其中 XXTXX^TXXT 为样本 ZZZ 的协方差矩阵,λ\lambdaλXXTXX^TXXT 的特征值,WWWXXTXX^TXXT 的特征向量。

将式 (5) 代入式 (2) 可得:

max{WTXXTW}=max{WTλW}=max{λWWT}=maxλE(7)\begin{aligned} & max\{W^T X X^T W\} \\ = & max\{W^T\lambda W\} \\ = & max\{\lambda WW^T\} \\ = & max{\lambda E} \\ \end{aligned}\tag{7} ===max{WTXXTW}max{WTλW}max{λWWT}maxλE(7)

于是,只需要对协方差矩阵 XXTXX^TXXT进行特征值分解,将求得的特征值排序:λ1≥,λ2≥,...,λm\lambda_1 \geq,\lambda_2 \geq,...,\lambda_mλ1,λ2,...,λm,再取前 kkk 个特征值对应的特征向量构成投影矩阵 W=(w1,w2,...,wk)W = (w_1,w_2,...,w_k)W=(w1,w2,...,wk),这就是主成分分析的解。

主成分所占整个信息的百分比可以用下式计算:

∑i=1kλi∑i=1mλi(8)\frac{\sum_{i=1}^k \lambda_i}{\sum_{i=1}^m \lambda_i} \tag{8}i=1mλii=1kλi(8)

PCA 算法描述如下图所示:



图6 PCA 算法

实践中常通过对 X 进行奇异值(SVD)分解来代替协方差矩阵的特征值分解。



3.2 维数选择

降维后低维空间的维数 kkk 通常是实现指定的,或通过在 kkk 值不同的低维空间中对 KNN 分类器(或其他开销较小的学习器)进行交叉验证来选去较好的 kkk 值。对 PCA,还可以从重构的角度设置一个重构阈值,例如 t=95%t=95\%t=95%,然后选择使下式成立的最小 kkk 值:[2]

∑i=1kλi∑i=1mλi≥t(9)\frac{\sum_{i=1}^k \lambda_i}{\sum_{i=1}^m \lambda_i} \geq t \tag{9}i=1mλii=1kλit(9)


显然,低维空间与原始高维空间必有不同,因为对应于最小的 m-k 个特征值的特征向量被舍弃了,这是降维导致的结果。但是舍弃这部分信息往往是必要的:一方面,舍弃这部分信息之后能使样本的采样密度增大,这正是降维的重要动机;另一方面,当数据收到噪声影响时,最小的特征值所对应的特征向量往往与噪声有关,将它们舍弃能在一定程度起到去除噪声的效果。



4. Sklearn 实现

sklearn.decomposition.PCA (n_compOnents=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)

n_compoents:主成分数量,当为 0.0 到 1.0 之间的浮点数时,表示希望保留的方差比。



Methods

fit(self, X[, y]) Fit the model with X.

fit_transform(self, X[, y]) Fit the model with X and apply the dimensionality reduction on X.

get_covariance(self) Compute data covariance with the generative model.

get_params(self[, deep]) Get parameters for this estimator.

get_precision(self) Compute data precision matrix with the generative model.

inverse_transform(self, X) Transform data back to its original space.

score(self, X[, y]) Return the average log-likelihood of all samples.

score_samples(self, X) Return the log-likelihood of each sample.

set_params(self, **params) Set the parameters of this estimator.

transform(self, X) Apply dimensionality reduction to X.



查看 PCA 的详细信息:

components_:主成分

explained_variance_:解释方差

explained_variance_ratio_:解释方差比


4.1 主成分可视化

first_pc = pca.components_[0]
second_pc = pca.components_[1]transformed_data = pca.transform(data)
for ii,jj in zip(transformed_data, data):plt.scatter( first_pc[0]*ii[0], first_pc[1]*ii[0], color="r")plt.scatter( second_pc[0]*ii[1], second_pc[1]*ii[1], color="c")plt.scatter( jj[0], jj[1], color="b")plt.xlabel("bonus")
plt.ylabel("long-term incentive")
plt.show()


图7 安然数据集

5. 在线可视化网站

通过这个网站,你可以更直观的了解到 PCA 降维的含义。



图8 3维数据主成分

参考文献

[1] Aurelien Geron, 王静源, 贾玮, 边蕤, 邱俊涛. 机器学习实战:基于 Scikit-Learn 和 TensorFlow[M]. 北京: 机械工业出版社, 2018: 191.

[2] 周志华. 机器学习[M]. 北京: 清华大学出版社, 2016: 53-56.229-233 .


推荐阅读
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了200个经典c语言源代码,包括函数的使用,如sqrt函数、clanguagefunct等。这些源代码可以帮助读者更好地理解c语言的编程方法,并提供了实际应用的示例。 ... [详细]
author-avatar
awrjftyitik
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有